from enum import Enum
from pathlib import Path

class TestScenario(Enum):
    """
    测试场景枚举类，将数字编号映射到对应的文件路径
    """
    SCENARIO_1 = "方案1-黑方艇数量_3.json"
    SCENARIO_2 = "方案2-黑方艇数量_3.json"
    SCENARIO_3 = "方案3-黑方艇数量_5.json"
    SCENARIO_4 = "方案4-黑方艇数量_5.json"
    SCENARIO_5 = "方案5-黑方艇数量_5.json"
    SCENARIO_6 = "方案6-黑方艇数量_5.json"
    SCENARIO_7 = "方案7-黑方艇数量_7.json"
    SCENARIO_8 = "方案8-黑方艇数量_7.json"
    SCENARIO_9 = "方案9-黑方艇数量_7.json"
    SCENARIO_10 = "方案10-黑方艇数量_10.json"
    SCENARIO_11 = "方案11-黑方艇数量_10.json"
    SCENARIO_12 = "方案12-黑方艇数量_15.json"
    SCENARIO_13 = "方案13-黑方艇数量_15.json"
    SCENARIO_14 = "方案14-黑方艇数量_15.json"
    SCENARIO_15 = "方案15-黑方艇数量_15.json"

class ScenarioManager:
    """
    场景管理器，用于处理测试场景文件路径
    """

    def __init__(self, base_directory: str = "test_data"):
        """
        初始化场景管理器

        Args:
            base_directory: 基础目录路径，默认为"test_data"
        """
        # 获取当前脚本所在目录作为基准路径
        self.script_dir = Path(__file__).parent
        self.base_directory = Path(base_directory)

        # 构建完整的基准目录路径
        if not self.base_directory.is_absolute():
            self.base_path = self.script_dir / self.base_directory
        else:
            self.base_path = self.base_directory

    def get_scenario_path(self, scenario_number: int) -> Path:
        """
        根据数字编号获取对应的文件路径

        Args:
            scenario_number: 场景编号 (1-15)

        Returns:
            Path: 完整的文件路径对象

        Raises:
            ValueError: 当场景编号无效时抛出异常
        """
        try:
            scenario = TestScenario[f"SCENARIO_{scenario_number}"]
            file_path = self.base_path / scenario.value
            return file_path
        except KeyError:
            raise ValueError(f"无效的场景编号: {scenario_number}。有效范围是 1-15。")

    def get_scenario_path_str(self, scenario_number: int) -> str:
        """
        根据数字编号获取对应的文件路径字符串

        Args:
            scenario_number: 场景编号 (1-15)

        Returns:
            str: 完整的文件路径字符串
        """
        return str(self.get_scenario_path(scenario_number))

    def list_all_scenarios(self):
        """
        列出所有可用的场景
        """
        print("可用的测试场景:")
        for i in range(1, 16):
            try:
                path = self.get_scenario_path(i)
                status = "✓" if path.exists() else "✗"
                print(f"{status} 场景 {i:2d}: {path}")
            except ValueError as e:
                print(f"✗ 场景 {i:2d}: 错误 - {e}")

# 全局实例，方便在world中使用
scenario_manager = ScenarioManager()

def get_scenario_path(scenario_number: int) -> str:
    """
    全局函数，根据数字编号获取对应的文件路径字符串

    Args:
        scenario_number: 场景编号 (1-15)

    Returns:
        str: 完整的文件路径字符串
    """
    return scenario_manager.get_scenario_path_str(scenario_number)

def get_scenario_path_obj(scenario_number: int) -> Path:
    """
    全局函数，根据数字编号获取对应的文件路径对象

    Args:
        scenario_number: 场景编号 (1-15)

    Returns:
        Path: 完整的文件路径对象
    """
    return scenario_manager.get_scenario_path(scenario_number)

# 使用示例
if __name__ == "__main__":
    # 方法1: 使用全局函数
    print("=== 使用全局函数 ===")
    for i in [1, 5, 10, 15]:
        try:
            path = get_scenario_path(i)
            print(f"场景 {i}: {path}")
        except ValueError as e:
            print(e)

    print("\n=== 使用场景管理器 ===")
    # 方法2: 使用场景管理器实例
    manager = ScenarioManager()
    for i in [2, 7, 12]:
        try:
            path = manager.get_scenario_path_str(i)
            print(f"场景 {i}: {path}")
        except ValueError as e:
            print(e)

    print("\n=== 所有场景列表 ===")
    # 列出所有场景
    manager.list_all_scenarios()
